package br.usp.ime.ingpos.testes.modelo;

import java.util.List;

import org.junit.Test;

import br.usp.ime.ingpos.modelo.Candidato;
import br.usp.ime.ingpos.modelo.Curriculo;
import br.usp.ime.ingpos.modelo.DadosPessoais;
import br.usp.ime.ingpos.modelo.Orientador;
import br.usp.ime.ingpos.modelo.Perfil;
import br.usp.ime.ingpos.modelo.TipoPerfil;
import br.usp.ime.ingpos.modelo.Usuario;
import br.usp.ime.ingpos.modelo.dao.CandidatoDAO;
import br.usp.ime.ingpos.modelo.dao.OrientadorDAO;
import br.usp.ime.ingpos.modelo.dao.PerfilDao;
import br.usp.ime.ingpos.modelo.dao.UsuarioDao;
import br.usp.ime.ingpos.seguranca.Criptografia;
import br.usp.ime.ingpos.testes.BancoDeDadosTestCase;
import br.usp.ime.ingpos.testes.services.RegistroNovoUsuarioServiceTeste;

public class UsuarioTeste extends BancoDeDadosTestCase {
	public UsuarioTeste(String name) {
		super(name);
	}

	@Test
	public void testCriarOuAtualizarUsuarioCandidato() {
		final CandidatoDAO candidatoDao = new CandidatoDAO(getSessionCreator());
		final UsuarioDao usuarioDao = new UsuarioDao(getSessionCreator());
		final PerfilDao perfilDao = new PerfilDao(getSessionCreator());
		
		Perfil perfil = perfilDao.findById(TipoPerfil.CANDIDATO.getId());
		
		if( perfil == null )
		{
			perfil = new Perfil(TipoPerfil.CANDIDATO.getId());
			perfil.setDescricao("Candidato");
			perfilDao.save(perfil);
		}

		for (int i = 0; i < 10; i++) {
			StringBuilder email = new StringBuilder("aluno").append(i).append(
					"@ime.usp.br");

			criaOuAtualizaUsuarioCandidato(email.toString(),
					RegistroNovoUsuarioServiceTeste.SENHA, usuarioDao,
					perfil, candidatoDao);
		}

		criaOuAtualizaUsuarioCandidato(RegistroNovoUsuarioServiceTeste.EMAIL,
				RegistroNovoUsuarioServiceTeste.SENHA, usuarioDao, perfil, candidatoDao);
	}

	private void criaOuAtualizaUsuarioCandidato(String email, String senhaTextoPuro,
			UsuarioDao usuarioDao, Perfil perfil, CandidatoDAO candidatoDao) {
		final String senha = Criptografia.md5(senhaTextoPuro);
		final String hash = Criptografia.md5(email);
		
		Candidato usuario;
		try {
			 usuario = (Candidato) usuarioDao.procurarPorEmail(email);
		} catch (ClassCastException e) {
			usuario = new Candidato();
		}
		if (usuario == null) {
			usuario = new Candidato();
		}

		usuario.setEmail(email);
		usuario.setSenha(senha);
		usuario.setHash(hash);
		usuario.setPerfil(perfil);
		if (usuario.getCurriculo() == null )
		    usuario.setCurriculo( new Curriculo() );
		
		DadosPessoais dados = usuario.getDadosPessoais();
		if (dados == null) {
		    dados = new DadosPessoais();
		}
		dados.setNomeCompleto( email );
		usuario.setDadosPessoais( dados );

		candidatoDao.saveOrUpdate(usuario);

		assertTrue(usuario.getUsuarioID() > 0);
		
		/*
		Usuario usuario = usuarioDao.procurarPorEmail(email);
		if (usuario == null) {
			usuario = new Usuario();
		}

		usuario.setEmail(email);
		usuario.setSenha(senha);
		usuario.setHash(hash);
		usuario.setPerfil(perfil);

		usuarioDao.saveOrUpdate(usuario);

		assertTrue(usuario.getUsuarioID() > 0);
		*/
	}

	@Test
	public void testCriarOuAtualizarUsuarioSecretaria() {
		final UsuarioDao usuarioDao = new UsuarioDao(getSessionCreator());
		final PerfilDao perfilDao = new PerfilDao(getSessionCreator());

		final String email = RegistroNovoUsuarioServiceTeste.EMAIL_SECRETARIA;
		final String senha = Criptografia
				.md5(RegistroNovoUsuarioServiceTeste.SENHA);
		final String hash = Criptografia
				.md5(RegistroNovoUsuarioServiceTeste.EMAIL_SECRETARIA);

		Usuario usuario = usuarioDao.procurarPorEmail(email);

		if (usuario == null) {
			usuario = new Usuario();

		}

		Perfil perfil = perfilDao.findById(TipoPerfil.SECRETARIA.getId());
		
		if( perfil == null )
		{
			perfil = new Perfil(TipoPerfil.SECRETARIA.getId());
			perfil.setDescricao("Secretaria");
			perfilDao.save(perfil);
		}

		usuario.setEmail(email);
		usuario.setSenha(senha);
		usuario.setHash(hash);
		usuario.setPerfil(perfil);

		if (usuario.getDadosPessoais() == null) {
			usuario.setDadosPessoais(new DadosPessoais());
		}
		usuario.getDadosPessoais().setNomeCompleto("Secretaria");

		usuarioDao.saveOrUpdate(usuario);

		assertTrue(usuario.getUsuarioID() > 0);
	}

	@Test
	public void testCriarOuAtualizarUsuarioCoordenador() {
		final UsuarioDao usuarioDao = new UsuarioDao(getSessionCreator());
		final PerfilDao perfilDao = new PerfilDao(getSessionCreator());

		final String email = RegistroNovoUsuarioServiceTeste.EMAIL_COORDENADOR;
		final String senha = Criptografia
				.md5(RegistroNovoUsuarioServiceTeste.SENHA);
		final String hash = Criptografia
				.md5(RegistroNovoUsuarioServiceTeste.EMAIL_COORDENADOR);

		Usuario usuario = usuarioDao.procurarPorEmail(email);
		if (usuario == null) {
			usuario = new Usuario();

		}
		
		Perfil perfil = perfilDao.findById(TipoPerfil.COORDENADOR.getId());
		
		if( perfil == null )
		{
			perfil = new Perfil(TipoPerfil.COORDENADOR.getId());
			perfil.setDescricao("Coordenador");
			perfilDao.save(perfil);
		}			

		usuario.setEmail(email);
		usuario.setSenha(senha);
		usuario.setHash(hash);
		usuario.setPerfil(perfil);

		if (usuario.getDadosPessoais() == null) {
			usuario.setDadosPessoais(new DadosPessoais());
		}
		usuario.getDadosPessoais().setNomeCompleto("Coordenador");

		usuarioDao.saveOrUpdate(usuario);

		assertTrue(usuario.getUsuarioID() > 0);
	}

	@Test
	public void testCriarOuAtualizarUsuarioProfessor() {
		final UsuarioDao usuarioDao = new UsuarioDao(getSessionCreator());
		final OrientadorDAO orientadorDao = new OrientadorDAO(getSessionCreator());
		final PerfilDao perfilDao = new PerfilDao(getSessionCreator());

		final String email = RegistroNovoUsuarioServiceTeste.EMAIL_PROFESSOR;
		final String senha = Criptografia
				.md5(RegistroNovoUsuarioServiceTeste.SENHA);
		final String hash = Criptografia
				.md5(RegistroNovoUsuarioServiceTeste.EMAIL_PROFESSOR);

		
		Orientador usuario;
		try {
			 usuario = (Orientador) usuarioDao.procurarPorEmail(email);
		} catch (ClassCastException e) {
			usuario = new Orientador(RegistroNovoUsuarioServiceTeste.EMAIL_PROFESSOR);
		}
		if (usuario == null) {
			usuario = new Orientador(RegistroNovoUsuarioServiceTeste.EMAIL_PROFESSOR);
		}

		Perfil perfil = perfilDao.findById(TipoPerfil.PROFESSOR.getId());
		
		if( perfil == null )
		{
			perfil = new Perfil(TipoPerfil.PROFESSOR.getId());
			perfil.setDescricao("Professor");
			perfilDao.save(perfil);
		}

		usuario.setEmail(email);
		usuario.setSenha(senha);
		usuario.setHash(hash);
		usuario.setPerfil(perfil);

		if (usuario.getDadosPessoais() == null) {
			usuario.setDadosPessoais(new DadosPessoais());
		}
		usuario.getDadosPessoais().setNomeCompleto("Professor");

		orientadorDao.saveOrUpdate(usuario);

		assertTrue(usuario.getUsuarioID() > 0);
	}
	
	@Test
	public void testBuscarTodosUsuarios() {
		final UsuarioDao usuarioDao = new UsuarioDao(getSessionCreator());
		assertTrue(!usuarioDao.findAll().isEmpty());
	}

	@Test
	public void testProcurarPorEmail() {
		final UsuarioDao usuarioDao = new UsuarioDao(getSessionCreator());
		final String email = RegistroNovoUsuarioServiceTeste.EMAIL;

		assertNotNull((usuarioDao.procurarPorEmail(email)));

	}

	@Test
	public void testProcurarPorEmailESenha() {
		final UsuarioDao usuarioDao = new UsuarioDao(getSessionCreator());

		final String email = RegistroNovoUsuarioServiceTeste.EMAIL;
		final String senha = RegistroNovoUsuarioServiceTeste.SENHA;

		assertNotNull(usuarioDao.findByEmailAndPassword(email,
				Criptografia.md5(senha)));
	}

}
